perm filename PIXNIC.SAI[VIS,HPM]7 blob sn#155619 filedate 1975-04-18 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE
C00003 00003	INTEGER PROCEDURE PFLDIM(STRING FILNAM)
C00008 00004	INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS)
C00010 00005	INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE STRING FILNAM)
C00013 00006	INTEGER PROCEDURE CAMPIX(INTEGER CAM,YEDGE,XEDGE,SUMS,CLPINC
C00016 00007	DEFINE PCLN=0  comment index of word in a picture file containing
C00018 ENDMK
C⊗;
REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE;
REQUIRE "TVSIX.REL[1,PDQ]" LOAD_MODULE;
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
EXTERNAL INTEGER PROCEDURE PIXEL(REFERENCE INTEGER PIX; INTEGER I,J);
EXTERNAL PROCEDURE PUTEL(REFERENCE INTEGER PIX; INTEGER I,J,VALUE);
INTEGER PROCEDURE PFLDIM(STRING FILNAM);
  comment  returns the size of the picture FILNAM on disk.
		used for allocating arrays in preparation for
		actually reading them. Returns 0 on failure.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
 LOOKUP(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  INTEGER K,KK;
  ARRYIN(10,BUF[0],'200); CLOSE(10);
  KK←0;
  FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
  IF BUF[0]≠-1 ∨ KK=0 THEN RETURN(0);
  BYBI←BUF[1];
  LNBY←BUF[6]-BUF[5]+1;
  PCLN←BUF[4]-BUF[3]+1;
  LNWD←BUF[2];
  LNBYA←LNWD*(36%BYBI);
  PCWD←LNWD*PCLN;
  XXPICLOC←(BUF[KK] LAND '777777)-'200;
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;

INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
  comment  read the picture in file FILNAM into area of core whose first
		word is PICTURE. PFLDIM(FILNAM) words are needed.
		Returns picture size of success, 0 on failure.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
 LOOKUP(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  INTEGER K,KK;
  ARRYIN(10,BUF[0],'200);
  KK←0;
  FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
  IF BUF[0]≠-1 ∨ KK=0 THEN RETURN(0);
  L←LOCATION(PICTURE);
  MEMORY[L+9]←BYBI←BUF[1];
  MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
  MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
  MEMORY[L+4]←LNWD←BUF[2];
  MEMORY[L+7]←WDBY←36%BYBI;
  MEMORY[L+6]←LNBYA←LNWD*WDBY;
  MEMORY[L+1]←PCWD←PCLN*LNWD;
  MEMORY[L+2]←PCBY←PCLN*LNBY;
  MEMORY[L+3]←PCBYA←PCLN*LNBYA;
  MEMORY[L+8]←WDBI←WDBY*BYBI;
  MEMORY[L+10]←12+PCLN+L;
  MAKTAB(PICTURE);
  XXPICLOC←(BUF[KK] LAND '777777)-'200;
  FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
  ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
  comment  returns the size of the array needed to hold a hypothetical
		picture HEIGHT scanlines by WIDTH pixels per scanline
		by BITS bits per pixel.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER L;
 BYBI←BITS;
 LNBY←WIDTH;
 PCLN←HEIGHT;
 WDBY←36%BYBI;
 LNWD←(LNBY+WDBY-1)%WDBY;
 LNBYA←LNWD*WDBY;
 PCWD←PCLN*LNWD;
 RETURN(12+PCLN+LNBYA+PCWD);
 END;

INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
  comment  actually creates an empty picture HEIGHT by WIDTH by BITS in
		the area of core beginning with PICTURE. Returns its size.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 L←LOCATION(PICTURE);
 MEMORY[L+9]←BYBI←BITS;
 MEMORY[L+5]←LNBY←WIDTH;
 MEMORY[L+0]←PCLN←HEIGHT;
 MEMORY[L+7]←WDBY←36%BYBI;
 MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
 MEMORY[L+6]←LNBYA←LNWD*WDBY;
 MEMORY[L+1]←PCWD←PCLN*LNWD;
 MEMORY[L+2]←PCBY←PCLN*LNBY;
 MEMORY[L+3]←PCBYA←PCLN*LNBYA;
 MEMORY[L+8]←WDBI←WDBY*BYBI;
 MEMORY[L+10]←12+PCLN+L;
 MAKTAB(PICTURE);
 RETURN(12+PCLN+LNBYA+PCWD);
 END;
 
INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
  comment  write out the picture in the core area starting with
		PICTURE, creating a file called FILNAM. Returns
		the size of the original file on success, else 0.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
 ENTER(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  L←LOCATION(PICTURE);
  BUF[0]←-1;
  BUF[1]←BYBI←MEMORY[L+9];
  BUF[2]←LNWD←MEMORY[L+4];
  BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
  BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
  BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
  WDBY←36%BYBI;
  LNWD←(LNBY+WDBY-1)%WDBY;
  LNBYA←LNWD*WDBY;
  ARRYOUT(10,BUF[0],'200);
  ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE CAMPIX(INTEGER CAM,YEDGE,XEDGE,SUMS,CLPINC;
					REFERENCE INTEGER PICTURE);
    comment  read a picture from camera CAM of size defined by array PICTURE
                  the area of core beginning with PICTURE. Upper left hand
                  corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
   BEGIN
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI,LINTAB;
   INTEGER L;
   EXTERNAL INTEGER ERROR,TVCAM;

   L←LOCATION(PICTURE);
   PCLN←MEMORY[L+0];
   PCWD←MEMORY[L+1];
   LNWD←MEMORY[L+4];
   LNBY←MEMORY[L+5];
   LNBYA←MEMORY[L+6];
   BYBI←MEMORY[L+9];
   LINTAB←MEMORY[L+11];

   ERROR←1; TVCAM←CAM;

   IF SUMS>1 ∨ CLPINC<8 ∨ BYBI≠4 THEN
      BEGIN
     comment  use Quam's general picture taker;
      EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
      EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
      DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
          SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
          comment  for interfacing quam internal format;
      INTEGER ARRAY PIC[0:15];
      PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
      PIC[BIT]←BYBI;
      PIC[SIZEX]←LNBY;
      PIC[SIZEY]←PCLN;
      PIC[SIZEL]←LNWD;
      TVSIX(PIC,SUMS,CLPINC);
      ARRBLT(MEMORY[LINTAB],MEMORY[PIC[PTR] LAND '777777],PCWD);
      PICREL(PIC);
      END
   ELSE
      BEGIN
      EXTERNAL PROCEDURE TVIN;
      EXTERNAL INTEGER BCLIP,TCLIP,FLINE,LLINE,LSIDE,RSIDE,TVWORD;
      BCLIP←7; TCLIP←0;
      FLINE←YEDGE; LLINE←FLINE+PCLN-1;
      LSIDE←XEDGE; RSIDE←LSIDE+LNBY-1;
      TVWORD←((-PCWD) LSH 18) LOR (LINTAB-1);
      TVIN;
      END;
   RETURN(12+PCLN+LNBYA+PCWD);
   END;



DEFINE PCLN=0;  comment index of word in a picture file containing
			number of scanlines in the picture;
DEFINE PCWD=1;	comment number of words in the picture;
DEFINE PCBY=2;	comment number of valid bytes in the picture;
DEFINE PCBYA=3;	comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4;	comment no. of words per scanline;
DEFINE LNBY=5;	comment no. of valid bytes per scanline;
DEFINE LNBYA=6;	comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7;	comment no. of bytes per word;
DEFINE WDBI=8;	comment no. of bits containing data in a word;
DEFINE BYBI=9;	comment no. of bits per byte;
DEFINE BPTAB=10; comment address of second entry in byte pntr. table;
DEFINE LINTAB=11; comment actual address of the first entry in the row table;